/**
 * 哈希集合检测循环。题意的关键是会进入无限循环。
 * @param {number} n
 * @return {boolean}
 */
var isHappy = function (n) {
    // 把每次的结果存储，如果有相同值，则进入了无限循环
    let sumSet = new Set()

    while (n !== 1 && !sumSet.has(n)) {
        sumSet.add(n)
        n = getSum(n)
    }
    return n === 1
};

function getSum(n) {
    let sum = 0
    while (n !== 0) {
        let i = n % 10
        sum += i * i
        n = ~~(n / 10)
    }
    return sum
}


/**
 * 快慢指针法，如果是循环的话，则快的值始终会追上慢的值。
 * @param {number} n
 * @return {boolean}
 */
var isHappy = function (n) {
    let slow = n, fast = getSum(n)

    while (fast !== 1 && slow !== fast) {
        slow = getSum(slow)
        fast = getSum(getSum(fast))
    }
    return fast === 1
};
